/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import Control.exceptions.IllegalOrphanException;
import Control.exceptions.NonexistentEntityException;
import Entidades.Clientemayorista;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Localidad;
import Entidades.Equipo;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author luksCastro
 */
public class ClientemayoristaJpaController implements Serializable {

    public ClientemayoristaJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Clientemayorista clientemayorista) {
        if (clientemayorista.getEquipoList() == null) {
            clientemayorista.setEquipoList(new ArrayList<Equipo>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Localidad localidadIdlocalidad = clientemayorista.getLocalidadIdlocalidad();
            if (localidadIdlocalidad != null) {
                localidadIdlocalidad = em.getReference(localidadIdlocalidad.getClass(), localidadIdlocalidad.getIdlocalidad());
                clientemayorista.setLocalidadIdlocalidad(localidadIdlocalidad);
            }
            List<Equipo> attachedEquipoList = new ArrayList<Equipo>();
            for (Equipo equipoListEquipoToAttach : clientemayorista.getEquipoList()) {
                equipoListEquipoToAttach = em.getReference(equipoListEquipoToAttach.getClass(), equipoListEquipoToAttach.getIdEquipo());
                attachedEquipoList.add(equipoListEquipoToAttach);
            }
            clientemayorista.setEquipoList(attachedEquipoList);
            em.persist(clientemayorista);
            if (localidadIdlocalidad != null) {
                localidadIdlocalidad.getClientemayoristaList().add(clientemayorista);
                localidadIdlocalidad = em.merge(localidadIdlocalidad);
            }
            for (Equipo equipoListEquipo : clientemayorista.getEquipoList()) {
                Clientemayorista oldClienteMayoristaidClienteMayOfEquipoListEquipo = equipoListEquipo.getClienteMayoristaidClienteMay();
                equipoListEquipo.setClienteMayoristaidClienteMay(clientemayorista);
                equipoListEquipo = em.merge(equipoListEquipo);
                if (oldClienteMayoristaidClienteMayOfEquipoListEquipo != null) {
                    oldClienteMayoristaidClienteMayOfEquipoListEquipo.getEquipoList().remove(equipoListEquipo);
                    oldClienteMayoristaidClienteMayOfEquipoListEquipo = em.merge(oldClienteMayoristaidClienteMayOfEquipoListEquipo);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Clientemayorista clientemayorista) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Clientemayorista persistentClientemayorista = em.find(Clientemayorista.class, clientemayorista.getIdClienteMay());
            Localidad localidadIdlocalidadOld = persistentClientemayorista.getLocalidadIdlocalidad();
            Localidad localidadIdlocalidadNew = clientemayorista.getLocalidadIdlocalidad();
            List<Equipo> equipoListOld = persistentClientemayorista.getEquipoList();
            List<Equipo> equipoListNew = clientemayorista.getEquipoList();
            List<String> illegalOrphanMessages = null;
            for (Equipo equipoListOldEquipo : equipoListOld) {
                if (!equipoListNew.contains(equipoListOldEquipo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Equipo " + equipoListOldEquipo + " since its clienteMayoristaidClienteMay field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (localidadIdlocalidadNew != null) {
                localidadIdlocalidadNew = em.getReference(localidadIdlocalidadNew.getClass(), localidadIdlocalidadNew.getIdlocalidad());
                clientemayorista.setLocalidadIdlocalidad(localidadIdlocalidadNew);
            }
            List<Equipo> attachedEquipoListNew = new ArrayList<Equipo>();
            for (Equipo equipoListNewEquipoToAttach : equipoListNew) {
                equipoListNewEquipoToAttach = em.getReference(equipoListNewEquipoToAttach.getClass(), equipoListNewEquipoToAttach.getIdEquipo());
                attachedEquipoListNew.add(equipoListNewEquipoToAttach);
            }
            equipoListNew = attachedEquipoListNew;
            clientemayorista.setEquipoList(equipoListNew);
            clientemayorista = em.merge(clientemayorista);
            if (localidadIdlocalidadOld != null && !localidadIdlocalidadOld.equals(localidadIdlocalidadNew)) {
                localidadIdlocalidadOld.getClientemayoristaList().remove(clientemayorista);
                localidadIdlocalidadOld = em.merge(localidadIdlocalidadOld);
            }
            if (localidadIdlocalidadNew != null && !localidadIdlocalidadNew.equals(localidadIdlocalidadOld)) {
                localidadIdlocalidadNew.getClientemayoristaList().add(clientemayorista);
                localidadIdlocalidadNew = em.merge(localidadIdlocalidadNew);
            }
            for (Equipo equipoListNewEquipo : equipoListNew) {
                if (!equipoListOld.contains(equipoListNewEquipo)) {
                    Clientemayorista oldClienteMayoristaidClienteMayOfEquipoListNewEquipo = equipoListNewEquipo.getClienteMayoristaidClienteMay();
                    equipoListNewEquipo.setClienteMayoristaidClienteMay(clientemayorista);
                    equipoListNewEquipo = em.merge(equipoListNewEquipo);
                    if (oldClienteMayoristaidClienteMayOfEquipoListNewEquipo != null && !oldClienteMayoristaidClienteMayOfEquipoListNewEquipo.equals(clientemayorista)) {
                        oldClienteMayoristaidClienteMayOfEquipoListNewEquipo.getEquipoList().remove(equipoListNewEquipo);
                        oldClienteMayoristaidClienteMayOfEquipoListNewEquipo = em.merge(oldClienteMayoristaidClienteMayOfEquipoListNewEquipo);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = clientemayorista.getIdClienteMay();
                if (findClientemayorista(id) == null) {
                    throw new NonexistentEntityException("The clientemayorista with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Clientemayorista clientemayorista;
            try {
                clientemayorista = em.getReference(Clientemayorista.class, id);
                clientemayorista.getIdClienteMay();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The clientemayorista with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Equipo> equipoListOrphanCheck = clientemayorista.getEquipoList();
            for (Equipo equipoListOrphanCheckEquipo : equipoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Clientemayorista (" + clientemayorista + ") cannot be destroyed since the Equipo " + equipoListOrphanCheckEquipo + " in its equipoList field has a non-nullable clienteMayoristaidClienteMay field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Localidad localidadIdlocalidad = clientemayorista.getLocalidadIdlocalidad();
            if (localidadIdlocalidad != null) {
                localidadIdlocalidad.getClientemayoristaList().remove(clientemayorista);
                localidadIdlocalidad = em.merge(localidadIdlocalidad);
            }
            em.remove(clientemayorista);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Clientemayorista> findClientemayoristaEntities() {
        return findClientemayoristaEntities(true, -1, -1);
    }

    public List<Clientemayorista> findClientemayoristaEntities(int maxResults, int firstResult) {
        return findClientemayoristaEntities(false, maxResults, firstResult);
    }

    private List<Clientemayorista> findClientemayoristaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Clientemayorista as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Clientemayorista findClientemayorista(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Clientemayorista.class, id);
        } finally {
            em.close();
        }
    }

    public int getClientemayoristaCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Clientemayorista as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
